package thread;


/**
 * 模拟线程死锁
 */
public class ThreadDeadlock {

    public static void main(String[] args) {
        /*
            多个线程都占用了对方的锁资源，但不肯相让，导致了死锁

            生活案例：
            妈妈：你先完成作业，才让你玩手机
            小明：你先让我玩手机，我才完成作业
         */
        //模拟死锁现象
        DeadLockDemo A = new DeadLockDemo(true);
        A.setName("A线程");
        DeadLockDemo B = new DeadLockDemo(false);
        B.setName("B线程");

        A.start();
        B.start();
    }
}

class DeadLockDemo extends Thread {

    static Object o1 = new Object();    //保证多线程，共享一个资源o1

    static Object o2 = new Object();

    boolean flag;

    public DeadLockDemo(boolean flag) {
        this.flag = flag;
    }

    @Override
    public void run() {
        /*
            1)flag为 true，线程A就会先得到/持有 o1 对象锁，然后尝试获取 o2 对象锁
            2)如果线程A得不到 o2 对象锁，就会 Blocked
            3)如果flag为F，线程B就会先先得到/持有 o2 对象锁，然后尝试获取 o1 对象锁
            4)如果线程A得不到 o1 对象锁，就会 Blocked
         */
        if (flag) {
            synchronized (o1) { // 对象互斥锁，下面就是同步代码块
                System.out.println(Thread.currentThread().getName() + "进入1");
                synchronized (o2) {
                    System.out.println(Thread.currentThread().getName() + "进入2");
                }
            }
        } else {
            synchronized (o2) {
                System.out.println(Thread.currentThread().getName() + "进入3");
                synchronized (o1) {
                    System.out.println(Thread.currentThread().getName() + "进入4");
                }
            }

        }

    }
}